#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Tesseract OCR自动安装脚本

此脚本用于帮助用户自动下载并安装Tesseract OCR（Windows版本），
并自动配置必要的环境变量，使Python程序能够正确识别Tesseract。

用法:
python install_tesseract.py
"""

import os
import sys
import tempfile
import shutil
import subprocess
import time
import requests
from tqdm import tqdm
import winreg  # Windows注册表操作
import ctypes
from pathlib import Path

def is_admin():
    """检查当前脚本是否以管理员权限运行"""
    try:
        return ctypes.windll.shell32.IsUserAnAdmin()
    except:
        return False

def run_as_admin():
    """以管理员权限重新运行脚本"""
    print("需要管理员权限来安装软件和设置环境变量")
    ctypes.windll.shell32.ShellExecuteW(
        None, "runas", sys.executable, " ".join(sys.argv), None, 1
    )
    sys.exit(0)

def provide_manual_installation_guide():
    """提供Tesseract OCR手动安装指南"""
    print("\n📋 Tesseract OCR 手动安装指南")
    print("===============================")
    print("\n1. 下载Tesseract OCR安装程序:")
    print("   - 访问: https://github.com/UB-Mannheim/tesseract/wiki")
    print("   - 下载最新的Windows安装程序 (通常是 .exe 文件)")
    
    print("\n2. 安装Tesseract OCR:")
    print("   - 运行安装程序")
    print("   - 默认安装路径: C:\\Program Files\\Tesseract-OCR")
    print("   - 安装时请确保选择'Additional language data'以支持多语言识别")
    
    print("\n3. 设置环境变量 (可选):")
    print("   - 右键点击'此电脑' -> '属性' -> '高级系统设置' -> '环境变量'")
    print("   - 在'系统变量'中找到并编辑'Path'")
    print("   - 添加新条目: C:\\Program Files\\Tesseract-OCR")
    print("   - 点击'确定'保存所有设置")
    
    print("\n4. 在Python代码中设置Tesseract路径:")
    print("   在cr_module.py文件中添加:")
    print("   ```python")
    print("   from cr_module import set_tesseract_path")
    print("   set_tesseract_path('C:\\Program Files\\Tesseract-OCR\\tesseract.exe')")
    print("   ```")
    
    print("\n5. 验证安装:")
    print("   - 打开命令提示符")
    print("   - 输入: tesseract --version")
    print("   - 运行: python test_ocr.py (我们将创建一个测试脚本)")
    
    # 创建测试脚本
    test_script_path = create_test_script()
    print(f"\n✅ 已创建测试脚本: {test_script_path}")
    print("请按照上述步骤完成安装，然后运行测试脚本验证功能。")

def download_file(url, save_path):
    """下载文件并显示进度条"""
    print(f"正在下载: {url}")
    response = requests.get(url, stream=True)
    total_size_in_bytes = int(response.headers.get('content-length', 0))
    block_size = 8192  # 1KB
    progress_bar = tqdm(total=total_size_in_bytes, unit='iB', unit_scale=True)
    
    with open(save_path, 'wb') as file:
        for data in response.iter_content(block_size):
            progress_bar.update(len(data))
            file.write(data)
    progress_bar.close()
    
    if total_size_in_bytes != 0 and progress_bar.n != total_size_in_bytes:
        raise Exception("下载失败: 数据不完整")
    
    print(f"下载完成: {save_path}")
    return save_path

def find_latest_tesseract_url():
    """查找最新的Tesseract OCR Windows安装程序URL"""
    # 尝试自动从GitHub获取最新版本信息
    # 由于GitHub API可能需要认证，这里使用一个已知的URL模板
    # 当需要更新时，可以手动修改这个函数
    
    # 目前使用的是UB Mannheim提供的稳定版本URL
    # 版本可能需要定期更新
    return "https://github.com/UB-Mannheim/tesseract/wiki/Downloading-Tesseract-OCR-Engine"

def install_tesseract():
    """下载并安装Tesseract OCR"""
    print("============================================")
    print("   📦 Tesseract OCR自动安装助手")
    print("============================================")
    print("此脚本将帮助您下载并安装Tesseract OCR")
    print("请确保您有足够的磁盘空间和网络连接")
    print("============================================")
    
    # 提示用户手动下载和安装
    print("\n由于自动下载最新版本可能会遇到GitHub API限制，")
    print("建议手动访问以下链接下载最新的64位安装程序:")
    print("https://github.com/UB-Mannheim/tesseract/wiki")
    
    # 尝试下载一个已知的稳定版本
    print("\n我们将尝试下载一个已知的稳定版本...")
    
    # 使用一个已知的稳定版本URL
    # 这个URL可能需要根据实际情况更新
    # 由于直接下载可能会有问题，我们提供手动下载选项
    install_exe = None
    
    try:
        # 创建临时目录
        temp_dir = tempfile.mkdtemp()
        print(f"临时目录: {temp_dir}")
        
        # 让用户选择安装方法
        choice = input("\n请选择安装方式:\n1. 手动下载并安装（推荐）\n2. 尝试自动下载并安装\n请输入1或2: ")
        
        if choice == "1":
            print("\n请访问以下链接下载Tesseract OCR安装程序:")
            print("https://github.com/UB-Mannheim/tesseract/wiki")
            print("选择最新的64位安装程序 (tesseract-ocr-w64-setup-x.x.x.exe)")
            
            # 让用户输入安装程序路径
            install_exe_path = input("\n请输入下载的安装程序路径: ")
            if not os.path.exists(install_exe_path):
                print("❌ 找不到安装程序，请检查路径是否正确")
                return None
            install_exe = install_exe_path
            
        elif choice == "2":
            # 尝试自动下载一个较新的版本
            # 注意：这个URL可能会过期，需要定期更新
            known_version_url = "https://digi.bib.uni-mannheim.de/tesseract/tesseract-ocr-w64-setup-5.3.3.20231005.exe"
            
            try:
                install_exe = os.path.join(temp_dir, "tesseract_installer.exe")
                download_file(known_version_url, install_exe)
            except Exception as e:
                print(f"❌ 自动下载失败: {str(e)}")
                print("请尝试手动下载安装程序")
                return None
        else:
            print("❌ 无效的选择")
            return None
        
        # 运行安装程序
        print(f"\n正在启动安装程序: {install_exe}")
        print("请按照安装向导完成Tesseract OCR的安装")
        print("⚠️  请记住安装路径，默认为: C:\\Program Files\\Tesseract-OCR")
        print("⚠️  安装时请确保选择'Additional language data'以支持多语言识别")
        
        # 启动安装程序
        subprocess.run([install_exe], shell=True)
        
        # 提示用户确认安装
        input("\n请确认Tesseract OCR安装已完成，然后按Enter键继续...")
        
        # 获取安装路径
        default_path = "C:\\Program Files\\Tesseract-OCR"
        user_input = input(f"\n请输入Tesseract OCR的安装路径\n(默认为: {default_path}，直接回车使用默认路径): ")
        
        install_path = user_input.strip() if user_input.strip() else default_path
        
        # 验证安装路径
        if not os.path.exists(os.path.join(install_path, "tesseract.exe")):
            print("❌ 验证失败: 找不到tesseract.exe")
            print(f"请检查安装路径是否正确: {install_path}")
            return None
        
        print(f"✅ 验证成功: Tesseract OCR已安装在 {install_path}")
        return install_path
        
    except Exception as e:
        print(f"❌ 安装过程中出错: {str(e)}")
        return None
    finally:
        # 清理临时目录
        if 'temp_dir' in locals() and os.path.exists(temp_dir):
            try:
                shutil.rmtree(temp_dir)
                print(f"已清理临时目录: {temp_dir}")
            except:
                print(f"无法清理临时目录: {temp_dir}")

def add_to_path(install_path):
    """将Tesseract OCR安装目录添加到系统PATH环境变量"""
    try:
        print("\n============================================")
        print("正在配置环境变量...")
        
        # 打开注册表获取当前PATH
        key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, 
                           r"SYSTEM\CurrentControlSet\Control\Session Manager\Environment",
                           0, winreg.KEY_READ | winreg.KEY_WRITE)
        
        current_path, _ = winreg.QueryValueEx(key, "PATH")
        
        # 检查PATH中是否已经包含Tesseract目录
        if install_path.lower() not in current_path.lower():
            # 添加到PATH
            new_path = f"{current_path};{install_path}"
            winreg.SetValueEx(key, "PATH", 0, winreg.REG_EXPAND_SZ, new_path)
            print(f"✅ 已将 {install_path} 添加到系统PATH环境变量")
        else:
            print("✅ Tesseract OCR目录已在PATH环境变量中")
        
        winreg.CloseKey(key)
        
        # 通知系统环境变量已更改
        ctypes.windll.user32.SendMessageTimeoutW(
            0xFFFF,  # HWND_BROADCAST
            0x001A,  # WM_SETTINGCHANGE
            0,
            "Environment",
            0,
            5000,
            0
        )
        
        return True
    except Exception as e:
        print(f"❌ 配置环境变量失败: {str(e)}")
        print("请手动将Tesseract OCR安装目录添加到系统PATH环境变量")
        return False

def create_config_file(install_path):
    """创建或更新Tesseract OCR配置文件"""
    try:
        # 检查是否存在.env文件
        env_path = os.path.join(os.getcwd(), ".env")
        tesseract_config = f"TESSERACT_PATH={install_path}\\tesseract.exe"
        
        if os.path.exists(env_path):
            # 读取现有.env文件
            with open(env_path, 'r', encoding='utf-8') as f:
                lines = f.readlines()
            
            # 检查是否已有Tesseract配置
            updated = False
            for i, line in enumerate(lines):
                if line.startswith("TESSERACT_PATH="):
                    lines[i] = tesseract_config + "\n"
                    updated = True
                    break
            
            if not updated:
                lines.append("\n" + tesseract_config + "\n")
            
            # 写回.env文件
            with open(env_path, 'w', encoding='utf-8') as f:
                f.writelines(lines)
            
            print(f"✅ 已更新 .env 文件中的 Tesseract 路径配置")
        else:
            # 创建新的.env文件
            with open(env_path, 'w', encoding='utf-8') as f:
                f.write(tesseract_config + "\n")
            
            print(f"✅ 已创建 .env 文件并配置 Tesseract 路径")
        
        return True
    except Exception as e:
        print(f"❌ 创建配置文件失败: {str(e)}")
        return False

def test_tesseract_installation(install_path):
    """测试Tesseract OCR安装是否成功"""
    try:
        print("\n============================================")
        print("正在测试Tesseract OCR安装...")
        
        # 尝试运行tesseract命令
        tesseract_exe = os.path.join(install_path, "tesseract.exe")
        result = subprocess.run([tesseract_exe, "--version"], 
                               capture_output=True, text=True, shell=True)
        
        if result.returncode == 0:
            print(f"✅ Tesseract OCR 命令行测试成功!")
            print(f"版本信息:")
            print(result.stdout)
            return True
        else:
            print(f"❌ Tesseract OCR 命令行测试失败")
            print(f"错误信息: {result.stderr}")
            return False
    except Exception as e:
        print(f"❌ 测试失败: {str(e)}")
        return False

def install_python_dependencies():
    """安装必要的Python依赖"""
    try:
        print("\n============================================")
        print("正在安装Python依赖...")
        
        # 安装或升级pytesseract
        subprocess.run([sys.executable, "-m", "pip", "install", "--upgrade", "pytesseract"], 
                      check=True)
        
        print("✅ Python依赖安装成功")
        return True
    except Exception as e:
        print(f"❌ Python依赖安装失败: {str(e)}")
        return False

def create_test_script():
    """创建Tesseract OCR测试脚本（无参数版本）"""
    return create_test_script_impl(None)

def create_test_script_impl(install_path=None):
    """创建Tesseract OCR测试脚本"""
    test_script = """
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Tesseract OCR测试脚本

import os
import sys
import pytesseract
from PIL import Image, ImageDraw, ImageFont
import numpy as np

# 尝试设置Tesseract路径（如果未在环境变量中设置）
try:
    # 常见安装路径列表
    common_paths = [
        "C:/Program Files/Tesseract-OCR/tesseract.exe",
        "C:/Program Files (x86)/Tesseract-OCR/tesseract.exe",
        "D:/Program Files/Tesseract-OCR/tesseract.exe"
    ]
    
    # 检查是否已经设置
    if not os.path.exists(pytesseract.pytesseract.tesseract_cmd):
        for path in common_paths:
            if os.path.exists(path):
                pytesseract.pytesseract.tesseract_cmd = path
                print(f"✅ 已自动设置Tesseract路径: {path}")
                break
        else:
            print("❌ 未找到Tesseract可执行文件，请手动设置路径")
            print("请编辑此脚本，设置正确的Tesseract路径：")
            print("pytesseract.pytesseract.tesseract_cmd = '你的安装路径'")
except Exception as e:
    print(f"设置Tesseract路径时出错: {e}")

def test_ocr():
    # 测试OCR功能
    print("📝 Tesseract OCR功能测试")
    print("===============================")
    
    # 创建一个简单的测试图像
    width, height = 300, 200
    image = Image.new('RGB', (width, height), color=(255, 255, 255))
    draw = ImageDraw.Draw(image)
    
    # 尝试使用中文字体
    try:
        # 尝试使用系统字体
        font_paths = [
            "C:/Windows/Fonts/simhei.ttf",    # 黑体
            "C:/Windows/Fonts/simsun.ttc",    # 宋体
            "C:/Windows/Fonts/msyh.ttc",      # 微软雅黑
            "C:/Windows/Fonts/msyhbd.ttc",    # 微软雅黑粗体
        ]
        
        font = None
        for font_path in font_paths:
            if os.path.exists(font_path):
                try:
                    font = ImageFont.truetype(font_path, 36)
                    print(f"✅ 使用字体: {font_path}")
                    break
                except:
                    continue
        
        if font is None:
            # 如果找不到中文字体，使用默认字体
            font = ImageFont.load_default()
            print("⚠️ 使用默认字体，可能无法正确显示中文")
        
        # 绘制测试文本
        test_text = "测试Tesseract OCR"
        draw.text((30, 80), test_text, fill=(0, 0, 0), font=font)
        
        # 保存测试图像
        image_path = "test_ocr_image.png"
        image.save(image_path)
        print(f"✅ 已创建测试图像: {image_path}")
        
        # 执行OCR识别
        print("\n🔍 执行OCR识别...")
        try:
            # 尝试中英文识别
            result = pytesseract.image_to_string(image, lang='chi_sim+eng')
            print(f"📊 识别结果:\n{result}")
            
            # 尝试仅英文识别
            result_en = pytesseract.image_to_string(image, lang='eng')
            print(f"\n📊 英文识别结果:\n{result_en}")
            
            return True
        except Exception as e:
            print(f"❌ OCR识别失败: {e}")
            print("提示：请确保已安装相应语言包")
            return False
    
    except Exception as e:
        print(f"❌ 创建测试图像时出错: {e}")
        return False

def check_tesseract_version():
    """检查Tesseract版本"""
    try:
        import subprocess
        result = subprocess.run([pytesseract.pytesseract.tesseract_cmd, '--version'], 
                              capture_output=True, text=True)
        print(f"\n📋 Tesseract版本信息:")
        print(result.stdout)
        return True
    except Exception as e:
        print(f"❌ 无法获取Tesseract版本: {e}")
        return False

def main():
    # 主函数
    print("📊 Tesseract OCR Python集成测试")
    print("===============================")
    
    # 检查pytesseract是否安装
    try:
        import pytesseract
        print(f"✅ pytesseract已安装: {pytesseract.__version__}")
        
        # 显示当前配置的Tesseract路径
        tesseract_cmd = pytesseract.pytesseract.tesseract_cmd
        print(f"📌 当前Tesseract命令路径: {tesseract_cmd}")
        
        # 检查路径是否存在
        if os.path.exists(tesseract_cmd):
            print(f"✅ Tesseract可执行文件存在")
        else:
            print(f"❌ Tesseract可执行文件不存在: {tesseract_cmd}")
            return False
        
        # 检查Tesseract版本
        check_tesseract_version()
        
        # 执行OCR测试
        test_ocr()
        
        print("\n🎉 测试完成！")
        print("如果识别成功，说明Tesseract OCR已正确安装和配置。")
        print("如果识别失败，请检查Tesseract安装和语言包。")
        
    except ImportError:
        print("❌ pytesseract未安装")
        print("请运行: pip install pytesseract pillow")
        return False
    except Exception as e:
        print(f"❌ 测试过程中出错: {e}")
        return False

if __name__ == "__main__":
    main()
"""
    
    # 写入测试脚本文件
    test_script_path = os.path.join(os.getcwd(), "test_ocr.py")
    with open(test_script_path, 'w', encoding='utf-8') as f:
        f.write(test_script)
    
    print(f"✅ 已创建测试脚本: {test_script_path}")
    return test_script_path

def main():
    """主函数"""
    # 检查命令行参数
    if len(sys.argv) > 1 and sys.argv[1] == "--create-test":
        # 直接创建测试脚本
        test_script_path = create_test_script()
        print(f"✅ 测试脚本已创建: {test_script_path}")
        return
    
    # 检查是否在Windows系统上运行
    if os.name != 'nt':
        print("❌ 此脚本仅支持Windows系统")
        sys.exit(1)
    
    # 检查管理员权限
    has_admin = is_admin()
    if not has_admin:
        print("⚠️ 注意：当前没有管理员权限，将提供手动安装指南")
        provide_manual_installation_guide()
        return
    
    # 安装Tesseract OCR
    install_path = install_tesseract()
    if not install_path:
        print("\n❌ Tesseract OCR安装失败")
        sys.exit(1)
    
    # 配置环境变量
    add_to_path(install_path)
    
    # 创建配置文件
    create_config_file(install_path)
    
    # 安装Python依赖
    install_python_dependencies()
    
    # 测试安装
    test_tesseract_installation(install_path)
    
    # 创建测试脚本
    test_script_path = create_test_script(install_path)
    
    print("\n============================================")
    print("🎉 Tesseract OCR安装和配置完成!")
    print("============================================")
    print(f"\n📋 后续步骤:")
    print(f"1. 运行测试脚本验证OCR功能:")
    print(f"   python {test_script_path}")
    print(f"2. 运行语音助手诊断检查所有功能:")
    print(f"   python -c \"from main import VoiceAssistant; assistant = VoiceAssistant(); assistant.run_diagnostic()\"")
    print(f"3. 启动语音助手:")
    print(f"   python -m main")
    print("\n📌 注意:")
    print("   - 某些命令可能需要重新打开命令提示符才能使环境变量生效")
    print("   - 如有问题，请检查Tesseract安装路径和配置")
    print("============================================")

if __name__ == "__main__":
    main()